﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace GestionApp
{
    public partial class FrmClientesBusq : Form
    {
        private Boolean bFilaActiva;
        
        public FrmClientesBusq()
        {
            InitializeComponent();
        }

        private void FrmClientesBusq_Load(object sender, EventArgs e)
        {
            // Conexion con la BD
            clsComun.setCadenaConexionBD();

            clsComunGestion.CargaComboProvincias(cboProvincia, true);

            // Por defecto, se marcará la línea vacia. 
            cboProvincia.SelectedValue = 0; 
            // Inicializar la búsqueda por Fecha Nacimiento 
            // Inicialmente no está activada. Se deshabilitan ambas fechas 
            chkFechaNac.Checked = false; 
            lblFechaNacDesde.Enabled = false; 
            lblFechaNacHasta.Enabled = false; 
            txtFechaNacDesde.Enabled = false; 
            txtFechaNacHasta.Enabled = false;

        }


        // Metodos
        private void botonBuscar()
        {
            // Conexión con la base de datos 
            MySqlConnection miConexion;
            MySqlDataReader miReader;

            // Consulta SQL a ejecutar 
            MySqlCommand miComando;
            String strSQL;

            // Linea para gestionar la lista 
            ListViewItem lineaLista;

            // Crear la conexión con la base de datos 
            miConexion = new MySqlConnection();

            try
            {
                // Asignar la cadena de conexión a la base de datos 
                miConexion.ConnectionString = clsComun.getCadenaConexionBD();
                // Abrir la conexión 
                miConexion.Open();
                // Preparar la cadena con la sentencia SQL a ejecutar 
                strSQL = "select c.cod_cli, c.nombre, c.apellidos, p.descripcion, c.tlf_fijo, c.fecha_nac " 
                    + "from clientes c, provincias p where c.cod_prov = p.codigo"; // 1=1"; en caso de no tener ninguna where comun

                if (txtCodigo.Text != "") strSQL = strSQL + " and c.cod_cli = " + txtCodigo.Text;

                if (txtDNI.Text != "") strSQL = strSQL + " and c.dni = '" + txtDNI.Text + "'";

                if (txtNombre.Text != "") strSQL = strSQL + " and c.nombre like '%" + txtNombre.Text + "%'";

                if (txtApellidos.Text != "") strSQL = strSQL + " and c.apellidos like '%" + txtApellidos.Text + "%'"; 
                
                // Si no se ha seleccionado la provincia con código 0 (provincia vacía) 
                if (cboProvincia.SelectedValue.ToString() != "0")
                    strSQL = strSQL + " and c.cod_prov = " + cboProvincia.SelectedValue.ToString(); 
                
                if (chkFechaNac.Checked) 
                {
                    strSQL = strSQL + " and c.fecha_nac >= '" + clsComun.FechaSQL(txtFechaNacDesde.Value) + "'";
                    MessageBox.Show(txtFechaNacDesde.Value.ToString());
                    strSQL = strSQL + " and c.fecha_nac <= '" + clsComun.FechaSQL(txtFechaNacHasta.Value) + "'"; 
                }

                strSQL = strSQL + " order by c.apellidos, c.nombre, c.cod_cli";

                //MessageBox.Show(strSQL); // va muy bien para depurar

                // Preparar el comando con la consulta a ejecutar 
                miComando = new MySqlCommand(strSQL, miConexion); 
                // Ejecutar la consulta y almacenar el resultado en el objeto Reader 
                miReader = miComando.ExecuteReader(); 
                // Inicializar el control ListView 
                lstClientes.Items.Clear(); 
                // Si la consulta no ha devuelto ningún registro 
                if (miReader.HasRows == false)
                {
                    MessageBox.Show("No existe ningún Cliente con estos criterios.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                } 

                // Procesamos los resultados, si no hay registros, no procesa nada 
                while (miReader.Read()) 
                { 
                    lineaLista = new ListViewItem();
                    lineaLista.Text = miReader.GetString("cod_cli");
                    lineaLista.SubItems.Add(miReader.GetString("apellidos"));
                    lineaLista.SubItems.Add(miReader.GetString("nombre"));
                    // Si la columna tlf_fijo contiene null, se cargará vacía 
                    if (miReader.IsDBNull(miReader.GetOrdinal("tlf_fijo"))) // GetOrdinal es primera, segunda.. columna
                        lineaLista.SubItems.Add("");                        // es mejor por si cambia de columna el telf
                    else lineaLista.SubItems.Add(miReader.GetString("tlf_fijo"));
                    lineaLista.SubItems.Add(miReader.GetString("descripcion"));
                    lineaLista.SubItems.Add(miReader.GetString("fecha_nac"));
                    lstClientes.Items.Add(lineaLista); 
                }
                // Cierro el objeto Reader 
                miReader.Close();
            }
            
            catch (Exception ex) 
            { 
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
            }
            finally 
            { 
                // Desconexión de la base de datos 
                miConexion.Close(); 
            }
        }


        // Eventos
        // para cada evento de cambio hay que limpiar la listView (codigo, dni... fechas...)
        private void cboProvincia_SelectedIndexChanged(object sender, EventArgs e)
        {
            
        }

        // Para codigo y DNI hay que restringir el tipo de dato introducido
        private void txtCodigo_KeyPress(object sender, KeyPressEventArgs e)
        {
            clsComun.TeclaNumero(sender, e);
        }
        
        private void txtApellidos_KeyPress(object sender, KeyPressEventArgs e)
        {
            clsComun.TeclaLetra(sender, e);
        }

        private void lstClientes_Leave(object sender, EventArgs e)
        {
            if (btnModificar.Focused | btnBorrar.Focused)
            {
                bFilaActiva = true;
            }
            else
            {
                bFilaActiva = false;
            }
        }

        private void lstClientes_DoubleClick(object sender, EventArgs e)
        {
            FrmClientesDet frmDetalle;
            // Instancia del formulario de detalle 
            // Crear instancia del formulario de detalle 
            frmDetalle = new FrmClientesDet();
            // Asignar el modo de operación de Consulta 
            frmDetalle.setModOpe(ModosOper.Consulta);
            // Indicar el código del cliente a mostrar 
            frmDetalle.setCodigo(lstClientes.FocusedItem.Text);
            // Mostrar la ventana de detalle 
            frmDetalle.ShowDialog();
        }


        // Clicks
        private void btnBuscar_Click(object sender, EventArgs e)
        {
            botonBuscar();
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            // Saldra un form nuevo con los datos del cliente para modificarlos
            //FrmClientesDet frmDetalle = new FrmClientesDet();

            //frmDetalle.ShowDialog();
            //
            //si el Count == 0 no vamos al detalle y decimos k tiene k selecc una fila del listView con un messageShow
            //else instanciamos el form, 
            //asignamos el modo con frmDetalle.setModOpe
            //frmDetalle.setCodigo(listClientes.FocusedItem.Text)
            // mostrar el form con showDialog



            FrmClientesDet frmDetalle; 
            // Instancia del formulario de detalle 
            DialogResult resp; 
            // Respuesta del formulario de detalle 
            // Si no se ha seleccionado ninguna línea de la lista, 
            // o no se considera activa (el foco no viene de la lista) 
            if ((lstClientes.SelectedItems.Count == 0) | bFilaActiva == false)
            { 
                // Mostrar mensaje de aviso. No se accederá al al Detalle 
                MessageBox.Show("Debe seleccionar un Cliente.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information); 
            } 
            else 
            { 
                // Hay una línea seleccionada, se accederá al Detalle 
                // Crear instancia del formulario de detalle 
                frmDetalle = new FrmClientesDet(); 
                // Asignar el modo de operación de Modificación 
                frmDetalle.setModOpe(ModosOper.Modificacion); 
                // Indicar el código del cliente a mostrar 
                frmDetalle.setCodigo(lstClientes.FocusedItem.Text); 
                // Mostrar la ventana de detalle 
                resp = frmDetalle.ShowDialog(); 
                
                
                // Si se ha cerrado el formulario de detalle aceptando la operación 
                if (resp == DialogResult.OK) 
                { 
                    // Ejecutar la búsqueda para refrescar la lista sin seleccionar la fila
                    // que estaba antes marcada
                    btnBuscar_Click(sender, e); 
                } 
                else 
                { 
                    // Volver a marcar la línea que estaba seleccionada de la lista
                    // para el caso de Cancelar la operacion en curso (modificar)
                    lstClientes.Focus(); 
                    lstClientes.Items[lstClientes.FocusedItem.Index].Selected = true; 
                } 
            }
        }         

        private void btnAñadir_Click(object sender, EventArgs e)
        {
            FrmClientesDet frmDetalle;
            // Instancia del formulario de detalle 
            DialogResult resp;
            // Respuesta del formulario de detalle 
            // Si no se ha seleccionado ninguna línea de la lista, 
            // o no se considera activa (el foco no viene de la lista) 
            if ((lstClientes.SelectedItems.Count == 0) | bFilaActiva == false)
            {
                // Mostrar mensaje de aviso. No se accederá al al Detalle 
                MessageBox.Show("Debe seleccionar un Cliente.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                // Hay una línea seleccionada, se accederá al Detalle 
                // Crear instancia del formulario de detalle 
                frmDetalle = new FrmClientesDet();
                // Asignar el modo de operación de Modificación 
                frmDetalle.setModOpe(ModosOper.Alta);
                // Mostrar la ventana de detalle 
                resp = frmDetalle.ShowDialog();


                // Si se ha cerrado el formulario de detalle aceptando la operación 
                if (resp == DialogResult.OK & lstClientes.Items.Count > 0) // si he añadido y la lista tenia cosas refresco la lista
                {
                    // Ejecutar la búsqueda para refrescar la lista sin seleccionar la fila
                    // que estaba antes marcada
                    btnBuscar_Click(sender, e);
                }
            }
        }


        



    }
}
